﻿#pragma once

#include <QtWidgets/QWidget>
#include "ui_opencv_raw.h"
#include <QFile>
#include <QFileDialog>
#include <QThread>
#include <QImage>
#include <QMessageBox>
#include <vector>
#include <iostream>

#include <opencv2/opencv.hpp>       // 引入opencv头文件
#include <opencv2/dnn_superres.hpp> // 引入超分辨率头文件
#include <opencv2/features2d.hpp>   // 引入特征检测头文件

using namespace std;                // 引入标准命名空间
using namespace cv;                 // 引入opencv命名空间
using namespace dnn_superres;       // 引入超分辨率命名空间

class raw_thread;                   // 向前声明

class opencv_raw : public QWidget
{
	Q_OBJECT

public:
	opencv_raw(QWidget* parent = nullptr);
	~opencv_raw();

	raw_thread* raw;    // 对象
	QThread* thread;    // 线程
	int width = 1536;   // 图像宽度
	int height = 1184;  // 图像高度
	QFile file;         // 打开raw文件
	Mat clone;          // 存储图像

signals:
	void send_raw_5files(const vector<Mat>&);

public slots:
	void read_image(const Mat&);

private:
	Ui::opencv_rawClass ui;
};

class raw_thread : public QObject
{
	Q_OBJECT

public slots:

	void read_raw_5files(const vector<Mat>&);

	// Gamma校正
	Mat gammaCorrection(const Mat& src, double gamma);
	// ORB特征对齐
	cv::Mat alignWithORB(const cv::Mat& ref_8u, const cv::Mat& frame_8u, cv::Mat& H);
	// 多帧平均函数
	cv::Mat multiFrameAverage(const std::vector<cv::Mat>& aligned_frames);

signals:
	void send_image(const Mat&);
};